package com.nuanshui.heatedloan.credit.dal.mapper;

import com.nuanshui.heatedloan.credit.form.PayOrderInfoForm;
import com.nuanshui.heatedloan.credit.vo.PayOrderInfoVO;
import com.nuanshui.heatedloan.pageable.Pager;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * Created by wangxw on 2017/6/26.
 */
public interface PayOrderInfoMapper {

    /***
     * 新增订单
     * @param payOrderInfoForm
     */
    void savePayOrderInfo(PayOrderInfoForm payOrderInfoForm);

    /***
     * 修改订单
     * @param payOrderInfoForm
     */
    void updatePayOrderInfo(PayOrderInfoForm payOrderInfoForm);

    /***
     * 获取订单
     * @param payOrderInfoForm
     * @return
     */
    PayOrderInfoVO loadVO(PayOrderInfoForm payOrderInfoForm);

    /***
     * 通过订单号修改订单状态
     * @param orderStatus
     */
    void updateOrderStatusByOrderno(@Param("orderNo") String orderNo, @Param("orderStatus") String orderStatus);

    /**
     * 通过用户id获取借款记录
     *
     * @param userId
     * @return
     */
    List<PayOrderInfoVO> loadPayOrderInfoVOByUserId(Pager<PayOrderInfoVO> pager, @Param("userId") String userId);


    /**
     * 通过用户id获取借款记录
     *
     * @param userId
     * @return
     */
    List<PayOrderInfoVO> loadPayOrderInfoVOByUserId(@Param("userId") String userId);

    /**
     * 获取用户的有贷款状态数据
     *
     * @param userId
     * @return
     */

    List<PayOrderInfoVO> loadPayOrderInfoVOByUserIdAndOrderStatus(@Param("userId") String userId);


    /***
     * 查询用户除了单期贷之外的状态为放款之前的
     * @param userId
     * @return
     */
    List<PayOrderInfoVO> loadNoSingleLoanOrderByUserId(@Param("userId") String userId);


    /***
     * 查询单期贷所有的在还款之前的状态
     * @param userId
     * @return
     */
    List<PayOrderInfoVO> loadSingleLoanBeforeReturn(@Param("userId") String userId);

    /***
     * 查询所有的未还款的记录  按预期排序  在按还款天数最先的  在按申请时间最前面的
     * @param userId
     * @return
     */
    List<PayOrderInfoVO> loadSingleLoanNoPay(@Param("userId") String userId, @Param("borrowType") int borrowType);


    /**
     * 根据id获取订单数据
     * @param id
     * @return
     */
    PayOrderInfoVO loadVOById(@Param("id") String id);

    /**
     * 获取用户总贷款总额
     * @param userId
     * @return
     */
    float loadUserLoanAmount(@Param("userId") String userId);

    /**
     * 获取用户总贷款次数
     * @param userId
     * @return
     */
    int loadUserLoanAccount(@Param("userId") String userId);

    /***
     * 根据状态和type获取其订单
     * @param userId
     * @param statuss
     * @param types
     * @return
     */
    List<PayOrderInfoVO> loadVOByStatusAndType(@Param("userId") String userId,
                                               @Param("statuss") List<Integer> statuss, @Param("types") List<Integer> types);

    /***
     * 获取用户贷款金额
     * @param userId
     * @param statuss
     * @param types
     * @return
     */
    Integer getSumAmtByUserIdByTypeByStatus(@Param("userId") String userId,
                                            @Param("statuss") List<Integer> statuss, @Param("types") List<Integer> types);

    /**
     *根据产品类型和用户Id来获取用户订信息(除还款)
     * @param userId
     * @param borrowType
     * @return
     */
    List<PayOrderInfoVO> loadPayOrderInfoVOByUserIdAndBorrowType(@Param("userId") String userId, @Param("borrowType") Integer borrowType);

    /**
     * 获取用户单期贷贷款额度和(待还款、逾期贷还款)
     * @param userId
     * @return
     */
    Integer loadSumByUserId(@Param("userId") String userId);


    /**
     * 根据订单号获取订单信息
     * @param orderNo
     * @return
     */
    PayOrderInfoVO loadVOByOrderNo(@Param("orderNo") String orderNo);


    /***
     * 根据用户的id和订单号改变订单的状态
     * @param userId
     * @param orderNo
     * @param status
     */
    void updateOrderStatusByUserIdAndOrderNo(@Param("userId") String userId,
                                             @Param("orderNo") String orderNo, @Param("status") int status);


    /***
     * 根据用户的id和订单号改变订单的状态
     * @param userId
     * @param orderNo
     * @param status
     */
    void updateOrderLendStatusByUserIdAndOrderNo(@Param("userId") String userId,
                                                 @Param("orderNo") String orderNo,
                                                 @Param("status") int status,
                                                 @Param("date") Date date);

    /***
     * 根据用户的id  贷款类型  状态查询贷款此时
     * @param userId
     * @param borrowType
     * @param statuss
     * @return
     */
    Integer getLoanCountByType(@Param("userId") String userId, @Param("borrowType") String borrowType,
                               @Param("statuss") List<Integer> statuss);

    /***
     *获取所有的订单
     * @param userId
     * @param statuss
     * @param types
     * @return
     */
    List<PayOrderInfoVO> loadVOByUserIdByTypeByStatus(@Param("userId") String userId,
                                                      @Param("statuss") List<Integer> statuss,
                                                      @Param("types") List<Integer> types);

    /**
     * 查询用户的订单在审核中和放款中数据
     * @param userId
     * @param borrowType
     * @return
     */
    List<PayOrderInfoVO> loadVoAuditByUserId(@Param("userId") String userId, @Param("borrowType") Integer borrowType);

    /***
     * 根据用户id   状态  类型返回贷款次数
     * @param userId
     * @param statuss
     * @param types
     * @return
     */
    int  loadUserLoanAccountByStatusAndType(@Param("userId") String userId,
                                            @Param("statuss") List<Integer> statuss,
                                            @Param("types") List<Integer> types);


    /***
     * 更新用户的订单信息
     * @param orderNo
     * @param overdueFee
     * @param overdueDays
     * @param orderStatus
     */
    void updateLateInfoByOrderNo(@Param("orderNo") String orderNo, @Param("overdueFee") int overdueFee,
                                 @Param("overdueDays") int overdueDays, @Param("orderStatus") int orderStatus);

    /***
     * 查询上次订单逾期天数
     * @param phone
     * @param userId
     * @return
     */
    public List<PayOrderInfoVO> getOverdueDay(@Param("phone")String phone,@Param("userId")String userId);

    /***
     * 查询是否有逾期未还的订单
     * @param phone
     * @return
     */
    public List<PayOrderInfoVO>  isOverdue(@Param("phone")String phone);

    /***
     * 更新订单的时间
     * @param updateType  1  更新为放款中
     * @param status     2  更新到的状态
     * @param orderNo   3 订单号
     *
     */
    public void updateStatusAndTime(@Param("updateType")int updateType, @Param("status")int status,
                                    @Param("orderNo")String orderNo,
                                    @Param("shouldReturnTime")Date shouldReturnTime,
                                    @Param("repayMixCardNo")String repayMixCardNo);

    /**
     * 查询用户还款记录
     * @param userId
     * @return
     */
    public List<PayOrderInfoVO> loadVoRepayByUserId(@Param("userId") String userId);
}

